long xc_ptrace(enum __ptrace_request request,
- u32 domid,
- long addr,
- long data);
+ u32 domid,
+ long addr,
+ long data);
long xc_ptrace_core(enum __ptrace_request request,
- u32 domid,
- long addr,
- long data);
+ u32 domid,
+ long addr,
+ long data);
int xc_waitdomain(int domain,
- int *status,
- int options);
+ int *status,
+ int options);
int xc_waitdomain_core(int domain,
- int *status,
- int options);
+ int *status,
+ int options);
/*
* DOMAIN MANAGEMENT FUNCTIONS
typedef struct {
u32 domid;
- unsigned int flags;
- unsigned int processors;
- unsigned int vcpus;
- u16 n_vcpus;
unsigned int dying:1, crashed:1, shutdown:1,
paused:1, blocked:1, running:1;
unsigned int shutdown_reason; /* only meaningful if shutdown==1 */
unsigned long shared_info_frame;
u64 cpu_time;
unsigned long max_memkb;
+ unsigned int vcpus;
s32 vcpu_to_cpu[MAX_VIRT_CPUS];
cpumap_t cpumap[MAX_VIRT_CPUS];
} xc_dominfo_t;
int xc_domain_dumpcore(int xc_handle,
- u32 domid,
- const char *corename);
+ u32 domid,
+ const char *corename);
/**
* @return 0 on success, -1 on failure
*/
int xc_domain_get_vcpu_context(int xc_handle,
- u32 domid,
- u32 vcpu,
- vcpu_guest_context_t *ctxt);
+ u32 domid,
+ u32 vcpu,
+ vcpu_guest_context_t *ctxt);
int xc_domain_setcpuweight(int xc_handle,
u32 domid,
u32 domid,
const char *image_name,
const char *cmdline,
- unsigned int control_evtchn,
- unsigned long flags);
+ unsigned int control_evtchn,
+ unsigned long flags);
struct mem_map;
int xc_vmx_build(int xc_handle,
unsigned long *arr, int num );
int xc_get_pfn_list(int xc_handle, u32 domid, unsigned long *pfn_buf,
- unsigned long max_pfns);
+ unsigned long max_pfns);
/*\
* GRANT TABLE FUNCTIONS
goto error_out;
}
- for (i = 0; i < info.n_vcpus; i++) {
+ for (i = 0; i < sizeof(info.vcpu_to_cpu) / sizeof(info.vcpu_to_cpu[0]);
+ i++) {
+ if (info.vcpu_to_cpu[i] == -1)
+ continue;
if (xc_domain_get_vcpu_context(xc_handle, domid, i, &ctxt[i])) {
PERROR("Could not get all vcpu contexts for domain");
goto error_out;
nr_pages = info.nr_pages;
header.xch_magic = 0xF00FEBED;
- header.xch_nr_vcpus = info.n_vcpus;
+ header.xch_nr_vcpus = info.vcpus;
header.xch_nr_pages = nr_pages;
header.xch_ctxt_offset = sizeof(struct xc_core_header);
header.xch_index_offset = sizeof(struct xc_core_header) +
sizeof(vcpu_guest_context_t) + nr_pages * sizeof(unsigned long));
write(dump_fd, &header, sizeof(struct xc_core_header));
- write(dump_fd, &ctxt, sizeof(ctxt[0]) * info.n_vcpus);
+ write(dump_fd, &ctxt, sizeof(ctxt[0]) * info.vcpus);
if ((page_array = malloc(nr_pages * sizeof(unsigned long))) == NULL) {
printf("Could not allocate memory\n");
if ( (rc = do_dom0_op(xc_handle, &op)) < 0 )
break;
info->domid = (u16)op.u.getdomaininfo.domain;
- info->processors = op.u.getdomaininfo.processors;
- info->n_vcpus = op.u.getdomaininfo.n_active_vcpus;
- info->flags = op.u.getdomaininfo.flags;
info->dying = !!(op.u.getdomaininfo.flags & DOMFLAGS_DYING);
info->crashed = !!(op.u.getdomaininfo.flags & DOMFLAGS_CRASHED);
memcpy(&info->cpumap, &op.u.getdomaininfo.cpumap,
sizeof(info->cpumap));
- next_domid = (u16)op.u.getdomaininfo.domain + 1;
- info++;
+ next_domid = (u16)op.u.getdomaininfo.domain + 1;
+ info++;
}
if( !nr_doms ) return rc;
}
int xc_domain_get_vcpu_context(int xc_handle,
- u32 domid,
- u32 vcpu,
- vcpu_guest_context_t *ctxt)
+ u32 domid,
+ u32 vcpu,
+ vcpu_guest_context_t *ctxt)
{
int rc, errno_saved;
dom0_op_t op;
xcio_error(ioctxt, "Could not get vcpu context");
}
- if ( (info->flags &
- (DOMFLAGS_SHUTDOWN | (SHUTDOWN_suspend<<DOMFLAGS_SHUTDOWNSHIFT))) ==
- (DOMFLAGS_SHUTDOWN | (SHUTDOWN_suspend<<DOMFLAGS_SHUTDOWNSHIFT)) )
+ if ( info->shutdown && info->shutdown_reason == SHUTDOWN_suspend )
{
return 0; // success
}
- if ( info->flags & DOMFLAGS_PAUSED )
+ if ( info->paused )
{
// try unpausing domain, wait, and retest
xc_domain_unpause( xc_handle, ioctxt->domain );
- xcio_error(ioctxt, "Domain was paused. Wait and re-test. (%u)",
- info->flags);
+ xcio_error(ioctxt, "Domain was paused. Wait and re-test.");
usleep(10000); // 10ms
goto retry;
if( ++i < 100 )
{
- xcio_error(ioctxt, "Retry suspend domain (%u)", info->flags);
+ xcio_error(ioctxt, "Retry suspend domain.");
usleep(10000); // 10ms
goto retry;
}
- xcio_error(ioctxt, "Unable to suspend domain. (%u)", info->flags);
+ xcio_error(ioctxt, "Unable to suspend domain.");
return -1;
}
goto out;
}
- nr_pfns = info.nr_pages;
+ nr_pfns = info.max_memkb >> PAGE_SHIFT;
/* cheesy sanity check */
if ( nr_pfns > 1024*1024 ){
if ( suspend_and_state( xc_handle, ioctxt, &info, &ctxt) )
{
- xcio_error(ioctxt, "Domain appears not to have suspended: %u",
- info.flags);
+ xcio_error(ioctxt, "Domain appears not to have suspended");
goto out;
}
if ( suspend_and_state( xc_handle, ioctxt, &info, &ctxt) )
{
xcio_error(ioctxt,
- "Domain appears not to have suspended: %u",
- info.flags);
+ "Domain appears not to have suspended");
goto out;
}
xcio_info(ioctxt,
- "SUSPEND flags %08u shinfo %08lx eip %08u "
- "esi %08u\n",info.flags,
+ "SUSPEND shinfo %08lx eip %08u esi %08u\n",
info.shared_info_frame,
ctxt.user_regs.eip, ctxt.user_regs.esi );
}
Py_BuildValue("i", info[i].cpumap[j]));
}
- info_dict = Py_BuildValue("{s:i,s:i,s:i,s:i,s:i,s:i,s:i,s:i,s:i"
+ info_dict = Py_BuildValue("{s:i,s:i,s:i,s:i,s:i,s:i,s:i,s:i"
",s:l,s:L,s:l,s:i}",
"dom", info[i].domid,
- "cpu", info[i].cpu,
"vcpus", info[i].vcpus,
"dying", info[i].dying,
"crashed", info[i].crashed,
if self.info['shutdown']:
reason = shutdown_reason(self.info['shutdown_reason'])
sxpr.append(['shutdown_reason', reason])
- sxpr.append(['cpu', self.info['cpu']])
+ sxpr.append(['cpu', self.info['vcpu_to_cpu'][0]])
sxpr.append(['cpu_time', self.info['cpu_time']/1e9])
sxpr.append(['vcpus', self.info['vcpus']])
sxpr.append(['cpumap', self.info['cpumap']])
struct exec_domain *ed;
u64 cpu_time = 0;
int vcpu_count = 0;
- u32 processors = 0;
int flags = DOMFLAGS_PAUSED | DOMFLAGS_BLOCKED;
-#if MAX_VIRT_CPUS > 32
-#error "update processors field in GETDOMAININFO"
-#endif
-
read_lock(&domlist_lock);
for_each_domain ( d )
sizeof(op->u.getdomaininfo.vcpu_to_cpu));
memset(&op->u.getdomaininfo.cpumap, 0,
sizeof(op->u.getdomaininfo.cpumap));
- for_each_exec_domain ( d, ed ) {
- op->u.getdomaininfo.vcpu_to_cpu[ed->id] = ed->processor;
- op->u.getdomaininfo.cpumap[ed->id] = ed->cpumap;
- }
/*
* - domain is marked as paused or blocked only if all its vcpus
* are paused or blocked
* - domain is marked as running if any of its vcpus is running
*/
-
- for_each_exec_domain(d, ed)
- {
- if (!((flags & DOMFLAGS_PAUSED) && test_bit(EDF_CTRLPAUSE, &ed->flags)))
- flags &= ~DOMFLAGS_PAUSED;
- if (!((flags & DOMFLAGS_BLOCKED) && test_bit(EDF_BLOCKED, &ed->flags)))
- flags &= ~DOMFLAGS_BLOCKED;
- flags |= (test_bit(EDF_RUNNING, &ed->flags) ? DOMFLAGS_RUNNING : 0);
-
- set_bit(ed->processor, &processors);
+ for_each_exec_domain ( d, ed ) {
+ op->u.getdomaininfo.vcpu_to_cpu[ed->id] = ed->processor;
+ op->u.getdomaininfo.cpumap[ed->id] = ed->cpumap;
+ if (!test_bit(EDF_CTRLPAUSE, &ed->flags))
+ flags &= ~DOMFLAGS_PAUSED;
+ if (!test_bit(EDF_BLOCKED, &ed->flags))
+ flags &= ~DOMFLAGS_BLOCKED;
+ if (test_bit(EDF_RUNNING, &ed->flags))
+ flags |= DOMFLAGS_RUNNING;
if ( ed->cpu_time > cpu_time )
cpu_time += ed->cpu_time;
vcpu_count++;
}
- op->u.getdomaininfo.n_active_vcpus = vcpu_count;
+
op->u.getdomaininfo.cpu_time = cpu_time;
+ op->u.getdomaininfo.n_vcpu = vcpu_count;
- op->u.getdomaininfo.flags =
+ op->u.getdomaininfo.flags = flags |
(test_bit( DF_DYING, &d->flags) ? DOMFLAGS_DYING : 0) |
(test_bit( DF_CRASHED, &d->flags) ? DOMFLAGS_CRASHED : 0) |
(test_bit( DF_SHUTDOWN, &d->flags) ? DOMFLAGS_SHUTDOWN : 0) |
- flags;
-
- op->u.getdomaininfo.flags |=
d->shutdown_code << DOMFLAGS_SHUTDOWNSHIFT;
- op->u.getdomaininfo.processors = processors;
op->u.getdomaininfo.tot_pages = d->tot_pages;
op->u.getdomaininfo.max_pages = d->max_pages;
- op->u.getdomaininfo.n_vcpu = d->shared_info->n_vcpu;
op->u.getdomaininfo.shared_info_frame =
__pa(d->shared_info) >> PAGE_SHIFT;
struct vcpu_guest_context *c;
struct domain *d;
struct exec_domain *ed;
- int active_index = 0;
- int exec_domain_index;
- exec_domain_index = op->u.getvcpucontext.exec_domain;
d = find_domain_by_id(op->u.getvcpucontext.domain);
-
if ( d == NULL )
{
ret = -ESRCH;
break;
}
- if ( (exec_domain_index >= MAX_VIRT_CPUS) )
+ if ( op->u.getvcpucontext.exec_domain >= MAX_VIRT_CPUS )
{
ret = -EINVAL;
+ put_domain(d);
break;
}
- for_each_exec_domain(d, ed)
+ ed = d->exec_domain[op->u.getvcpucontext.exec_domain];
+ if ( ed == NULL )
{
- if ( exec_domain_index == active_index )
- {
- op->u.getvcpucontext.exec_domain = ed->id;
- break;
- }
- active_index++;
+ ret = -ESRCH;
+ put_domain(d);
+ break;
}
+
op->u.getvcpucontext.cpu_time = ed->cpu_time;
if ( op->u.getvcpucontext.ctxt != NULL )
typedef struct {
/* IN variables. */
domid_t domain; /* NB. IN/OUT variable. */
- u16 n_active_vcpus; /* # of vcpus currently active */
/* OUT variables. */
#define DOMFLAGS_DYING (1<<0) /* Domain is scheduled to die. */
#define DOMFLAGS_CRASHED (1<<1) /* Crashed domain; frozen for postmortem. */
#define DOMFLAGS_SHUTDOWNMASK 255 /* DOMFLAGS_SHUTDOWN guest-supplied code. */
#define DOMFLAGS_SHUTDOWNSHIFT 16
u32 flags;
- u32 processors;
memory_t tot_pages;
memory_t max_pages;
memory_t shared_info_frame; /* MFN of shared_info struct */
#define DOM0_GETVCPUCONTEXT 37
typedef struct {
domid_t domain; /* domain to be affected */
- u16 exec_domain; /* NB. IN: nth active cpu / OUT: actual cpu # */
+ u16 exec_domain; /* vcpu # */
vcpu_guest_context_t *ctxt; /* NB. IN/OUT variable. */
u64 cpu_time;
} dom0_getvcpucontext_t;
-
typedef struct {
u32 cmd;
u32 interface_version; /* DOM0_INTERFACE_VERSION */